package xm.align.box
{
	import xm.definition.Align;
	import xm.align.box.info.AlignInfo;
	import xm.align.AlignObject;

	
	/**
	 * 설명         : 정렬용 HBox <br>
	 * 최초 작성  : 김정환 <br> 
	 * 수정         : <br>  
	 */
	public class AlignHBox extends BaseAlignBox
	{
		
		
		
		
		//-----------------------------------------------------------------------------------
		// constructor
		//-----------------------------------------------------------------------------------
		/**
		 * @param __cellNum
		 * @param __minCellSize
		 * @param __alignList
		 */		
		public function AlignHBox(__cellNum : int = 0, __minCellSize :Array = null, __alignList :Array = null )
		{
			super( __cellNum , __minCellSize, __alignList );
		}
		
		
		
		
		//-----------------------------------------------------------------------------------
		// public functions
		//-----------------------------------------------------------------------------------
		/**
		 * Hbox 가로정렬 
		 */		
		override public function workingAlign():void
		{
			var len : int = this._itemList.length;
			var cellSum : Number = this.x;
			
			for( var i:int = 0; i<len; i++ )
			{
				// displayobject 인지 alignBox 인지 판별하여 담아두고, 
				var item : Object = ( this._itemList[ i ].item != null )?this._itemList[ i ].item:this._itemList[ i ].box;
				var info : AlignInfo = this._itemList[ i ].info;
				
				
				// 정렬 선택 안되어있거나 ( 디폴트 왼쪽 ) , 선택이 왼쪽이거나, 셀너비 지정을 안한경우
				// 무조건 왼쪽정렬을 한다. 
				if( _alignList[ i ] == null || _alignList[ i ] == Align.LEFT )
				{
					item.x = info.paddingLeft + cellSum;
				}
				else
				{
					// 패딩 오른쪽은 오직 셀 안에서만 적용됨.
					item.x = cellSum + _minCellSize[ i ] - info.paddingRight - item.width;
				}
				
				item.y = this.y + info.paddingTop;
				
				// 만약 alignBox 이면 내부 정렬 실행 ( factorial pattern )
				if( item is BaseAlignBox ) item.workingAlign();
				
				// 만약 셀 기본너비 설정 안되어 있으면 기본으로 ( 아이템 너비 + 패딩 ) 을 정렬에 포함시킴
				cellSum += (_minCellSize[ i ]==-1) ? ( item.width + info.paddingLeft + info.paddingRight ) : _minCellSize[ i ];
			}
		}
		
		
		
		
		/**
		 * @param size 기본이 되는 셀 사이즈 정의
		 * @return AlignHBox
		 */		
		public function setDefaultCellSize( size:Number ):AlignHBox
		{
			this._defaultCellSize = size;
			
			var len : int = this.minCellSize.length;
			for( var i:int = 0; i<len; i++ )
			{
				if( this.minCellSize[ i ] == 0 )
				{
					this.minCellSize[ i ] = _defaultCellSize;
				}
			}
			
			return this;
		}
		
		
		/**
		 * @param list : box 타입이 아닌 DisplayObject 타입을 담은 list 를 넣는다.
		 */
		public function addSimpleItems( list:Array ):AlignHBox
		{
			var len : int = list.length;
			for( var i:int = 0; i<len; i++ )
			{
				addItem( new AlignObject( list[ i ] ) );
			}
			
			return this;
		}
		
		/**
		 * @param item Object
		 */		
		public function addSimpleItem( item:Object , padding:Array = null ):AlignHBox
		{
			addItem( new AlignObject( item, null, new AlignInfo( padding ) ) );
			return this;
		}
		
		
		
		/**
		 * @param box BaseAlignBox
		 * @param padding 시계방향 패딩값 ( length 상관없이 삽입가능 )
		 * @return AlignHBox
		 * 
		 */		
		public function addSimpleBox( box:BaseAlignBox=null, padding:Array=null ):AlignHBox
		{
			var ao : AlignObject = new AlignObject( null, box, new AlignInfo(padding) );
			addItem( ao );
			return this;
		}
		
		
		
		
		
		//-----------------------------------------------------------------------------------
		// setter / getter
		//-----------------------------------------------------------------------------------
		
		/**
		 * @return  widthMeasured : widthCellTotal 중에 큰것 반환
		 */		
		override public function get width():Number
		{
			return Math.max( cellTotalSize, widthMeasured );
		}
		
		
		/**
		 * @return 아이템 높이중 가장 큰것
		 */		
		override public function get height():Number
		{
			var h : Number = 0;
			var len : int = _itemList.length;
			for( var i:int = 0; i<len; i++ )
			{
				h = Math.max( h , ( _itemList[i].item != null ) ? _itemList[i].item.height : _itemList[i].box.height );
			}
			
			return h;
		}
		
		
		
		
		
		//-----------------------------------------------------------------------------------
		// destroy
		//-----------------------------------------------------------------------------------
		
		/**
		 * HBox 제거
		 */		
		override public function destroy():void
		{
			_cellNum = NaN;
			
			var len : int = _minCellSize.length;
			for( var i:int = 0; i<len; i++ )
			{
				delete _minCellSize.shift();
			}
			_minCellSize = null;
			
			len = _alignList.length;
			for( i=0; i<len; i++ )
			{
				delete _alignList.shift();
			}
			
			_alignList = null;
		}
		
	}
}







